#include "process_pool.h"

int main(int argc,char** argv)
{
    ARGS_CHECK(argc, 3);

    // 1. 生成套接字描述符
    int sfd = socket(AF_INET, SOCK_STREAM, 0);

    
    struct sockaddr_in ser_addr; // 服务器信息结构体
    bzero(&ser_addr, sizeof(ser_addr));
    ser_addr.sin_family = AF_INET; // 使用IPv4
    ser_addr.sin_port = htons(atoi(argv[2])); // 端口号
    ser_addr.sin_addr.s_addr = inet_addr(argv[1]); // IP地址

    // 2. connect
    int ret = connect(sfd, (struct sockaddr *)&ser_addr, sizeof(ser_addr));
    ERROR_CHECK(ret, -1, "connect");
    
    // 下载文件
    // 1. 接收文件名
    int data_len;
    char buf[1000]={0};
    ret = recv_n(sfd,&data_len,4); // 接收文件名长度
    SELFFUNC_ERR_CHECK(ret, "recv_n");
    ret = recv_n(sfd,buf,data_len); // 接收文件名
    SELFFUNC_ERR_CHECK(ret, "recv_n");
    int fd=open(buf,O_WRONLY|O_CREAT,0666);

    // 2. 接收文件大小
    off_t file_size, download_size = 0;
    ret = recv_n(sfd, &data_len, 4);
    SELFFUNC_ERR_CHECK(ret, "recv_n");
    ret = recv_n(sfd, &file_size, sizeof(file_size));
    SELFFUNC_ERR_CHECK(ret, "recv_n");

    time_t now, last_time;
    now = last_time = time(NULL);
    // 3. 分批接收文件内容
    while(1)
    {
        ret = recv_n(sfd,&data_len,4); // 接收文件内容长度
        SELFFUNC_ERR_CHECK(ret, "recv_n");
        if(data_len>0)
        {
            ret = recv_n(sfd,buf,data_len); // 接收文件内容
            SELFFUNC_ERR_CHECK(ret, "recv_n");
            write(fd,buf,data_len); // 把文件内容写到文件里

            download_size += data_len;
            now = time(NULL);
            if (now > last_time)
            {
                printf("%6.2lf%%\r", (double)download_size / file_size * 100);
                fflush(stdout);
                last_time = now;
            }
        }else{ // 接收到文件结束符
            break;
        }
    }
    close(fd);
    close(sfd);
}